package de.vogella.gwt.helloserver.client;

import java.util.ArrayList;
import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.DecoratedTabPanel;
import com.google.gwt.user.client.ui.Grid;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.user.client.ui.HasVerticalAlignment;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.ValueBoxBase.TextAlignment;
import com.google.gwt.user.client.ui.FlexTable;
import com.google.gwt.user.client.ui.VerticalPanel;

import de.vogella.gwt.helloserver.client.model.Lagerbestand;
import de.vogella.gwt.helloserver.client.model.Lagerplatz;
import de.vogella.gwt.helloserver.client.model.Produkt;

public class WareneingangGUI extends Composite {

	private final ServiceAsync service = GWT.create(Service.class);
	FlexTable flexTable = new FlexTable();
	TextBox tbProduktID = new TextBox();
	Button btnEinlagern = new Button("Produkte Einlagern");
	Button btnHinzu = new Button("Hinzuf\u00FCgen");
	private final Label labMenge = new Label("Menge");
	private final TextBox tbMenge = new TextBox();
	private final FlexTable flexTable_1 = new FlexTable();

	ArrayList<Produkt> produktList = new ArrayList<Produkt>();
	ArrayList<Produkt> newProduktList = new ArrayList<Produkt>();
	ArrayList<Lagerplatz> platzList = new ArrayList<Lagerplatz>();
	ArrayList<Lagerbestand> bestandList = new ArrayList<Lagerbestand>();

	public WareneingangGUI() {
		DecoratedTabPanel decoratedTabPanel = new DecoratedTabPanel();
		initWidget(decoratedTabPanel);

		VerticalPanel verticalPanel = new VerticalPanel();
		decoratedTabPanel.add(verticalPanel, "Wareneinlagerung", false);

		Grid grid = new Grid(1, 5);
		verticalPanel.add(grid);

		Label labProduktID = new Label("Produkt ID");
		labProduktID.setWordWrap(false);
		grid.setWidget(0, 0, labProduktID);

		tbProduktID.setAlignment(TextAlignment.LEFT);
		grid.setWidget(0, 1, tbProduktID);
		tbProduktID.setWidth("87px");
		grid.getCellFormatter().setVerticalAlignment(0, 1,
				HasVerticalAlignment.ALIGN_BOTTOM);
		grid.setWidget(0, 2, labMenge);
		grid.setWidget(0, 3, tbMenge);
		tbMenge.setWidth("71px");
		grid.setWidget(0, 4, btnHinzu);
		verticalPanel.add(flexTable);
		verticalPanel.add(btnEinlagern);
		verticalPanel.add(flexTable_1);

		btnEinlagern.addClickHandler(new ClickHandler() {
			public void onClick(ClickEvent event) {

				int row = flexTable.getRowCount();
				for (int i = 1; i < row; i++) {
					Produkt m = new Produkt();
					m.setId(flexTable.getText(i, 0));
					m.setBezeichnung(flexTable.getText(i, 1));
					m.setEinheit(flexTable.getText(i, 5));
					m.setBreite(flexTable.getText(i, 3));
					m.setHoehe(flexTable.getText(i, 4));
					m.setTiefe(flexTable.getText(i, 2));
					m.setGewicht(flexTable.getText(i, 5));
					m.setBestand(flexTable.getText(i, 7));
					newProduktList.add(m);
				}

				service.getProdukte(new AsyncCallback<ArrayList<Produkt>>() {

					@Override
					public void onFailure(Throwable caught) {
						Window.alert(caught.getMessage());
					}

					@Override
					public void onSuccess(ArrayList<Produkt> result) {
						produktList = result;
					}
				});

				service.getLagerplaetze(new AsyncCallback<ArrayList<Lagerplatz>>() {

					@Override
					public void onFailure(Throwable caught) {
						Window.alert(caught.getMessage());
					}

					@Override
					public void onSuccess(ArrayList<Lagerplatz> result) {
						platzList = result;
					}
				});

				service.getLagerbestand(new AsyncCallback<ArrayList<Lagerbestand>>() {

					@Override
					public void onFailure(Throwable caught) {
						Window.alert(caught.getMessage());
					}

					@Override
					public void onSuccess(ArrayList<Lagerbestand> result) {
						bestandList = result;
					}
				});

				mapProdukteZuPlaetze();
				
				for(Produkt p : newProduktList){
					for(Lagerplatz l : platzList){
						for(int i = 0 ; i < Integer.parseInt(p.getBestand()) ; i++){
							if((Integer.parseInt(p.getGewicht())+(l.getAktGewicht())) <= l.getMaxGewicht()){
								Window.alert("Produkt: " + p.getId() + " Lager: " + l.getId());
								l.setAktGewicht(l.getAktGewicht() + Integer.parseInt(p.getGewicht()));
								
							}
						}
					}
				}

			}
		});
		btnHinzu.addClickHandler(new ClickHandler() {
			public void onClick(ClickEvent event) {
//				Window.alert("btnHinzu 1");
				service.GetProdukt(tbProduktID.getText(),
						new AsyncCallback<Produkt>() {

							@Override
							public void onFailure(Throwable caught) {
								Window.alert(caught.getMessage());
							}

							@Override
							public void onSuccess(Produkt result) {
//								Window.alert("btnHinzu 2" + result.getId());
								if (result != null) {
									int row = flexTable.getRowCount();
									flexTable.setText(row, 0, result.getId());
									flexTable.setText(row, 1,
											result.getBezeichnung());

									flexTable.setText(row, 2, result.getTiefe()
											+ "");

									flexTable.setText(row, 3,
											result.getBreite() + "");

									flexTable.setText(row, 4, result.getHoehe()
											+ "");

									flexTable.setText(row, 5,
											result.getGewicht() + "");

									flexTable.setText(row, 6,
											result.getEinheit());

									flexTable.setText(row, 7, tbMenge.getText());

//									Window.alert(result.getId());
								}
							}
						});
			}
		});

		intiTable();
	}

	public void intiTable() {
		flexTable.setText(0, 0, "Produkt ID");
		flexTable.setText(0, 1, "Bezeichnung");
		flexTable.setText(0, 2, "Laenge");
		flexTable.setText(0, 3, "Breite");
		flexTable.setText(0, 4, "Hoehe");
		flexTable.setText(0, 5, "Gewicht");
		flexTable.setText(0, 6, "Einheit");
		flexTable.setText(0, 7, "Menge");

	}

	private void mapProdukteZuPlaetze() {
		int lagerID = 0;
		int produktID = 0;
		Lagerplatz platz = null;
		Produkt produkt = null;

		for (Lagerbestand bestand : bestandList) {

			lagerID = bestand.getLagerplatzID();
			produktID = bestand.getProduktID();

			for (Lagerplatz p : platzList) {
				if (lagerID == p.getId()) {
					platz = p;
					break;
				}
			}

			for (Produkt p : produktList) {
				if (produktID == Integer.parseInt(p.getId())) {
					produkt = p;
					break;
				}
			}
//			platz.getProdukt().add(produkt);
			platz.setAktGewicht(platz.getAktGewicht() + Integer.parseInt(produkt.getGewicht()) * bestand.getMenge());
		}

		// return platzList;

	}

}
